package stats

import (
	"fmt"

	"github.com/gin-gonic/gin"
)

// ScanStats 用于统计扫描结果
type ScanStats struct {
	Total            int    `json:"total"`             // 总IP数
	Connected        int    `json:"connected"`         // 连接成功数
	RootPrivilege    int    `json:"root_privilege"`    // 拥有root权限数
	PortClosed       int    `json:"port_closed"`       // 端口未开启数
	ConnectionFailed int    `json:"connection_failed"` // 连接失败数
	PortOpen         int    `json:"port_open"`         // 端口开放数
	AuthSuccess      int    `json:"auth_success"`      // 认证成功数
	SudoSupport      int    `json:"sudo_support"`      // 支持sudo数
	SuccessRate      string `json:"success_rate"`      // 成功率百分比
}

// CalcScanStats 统计扫描结果
func CalcScanStats(results []gin.H) ScanStats {
	stats := ScanStats{
		Total: len(results),
	}

	for _, result := range results {
		// 端口状态统计
		if portOpen, ok := result["port_open"].(bool); ok && portOpen {
			stats.PortOpen++
		}

		// 认证状态统计
		if authState, ok := result["auth_state"].(string); ok {
			switch authState {
			case "success":
				stats.AuthSuccess++
			case "failed":
				stats.ConnectionFailed++
			}
		}

		// 连接状态统计
		switch result["status"].(string) {
		case "connected", "sudo_supported":
			stats.Connected++
			if root, ok := result["root"].(bool); ok && root {
				stats.RootPrivilege++
			}
			if sudo, ok := result["sudo"].(bool); ok && sudo {
				stats.SudoSupport++
			}
		case "auth_failed":
			stats.ConnectionFailed++
		case "port_closed":
			stats.PortClosed++
		}
	}

	// 计算成功率
	if stats.Total > 0 {
		stats.SuccessRate = fmt.Sprintf("%.1f%%",
			float64(stats.Connected)/float64(stats.Total)*100)
	} else {
		stats.SuccessRate = "0%"
	}

	return stats
}
